<?php

class TSqlSelect {

	public static function simpleSelect( $tables, $tablekey = NULL, $options = NULL ) {
		
		$valor 		= ( isset( $options['valor'] ) ) 		? $options['valor'] : null;
    	$operador 	= ( isset( $options['operador'] ) ) 	? $options['operador'] : null;
    	$campo 		= ( isset( $options['campo'] ) ) 		? $options['campo'] : null;
    	$order 		= ( isset( $options['order'] ) ) 		? $options['order'] : 'asc';
    	$orderBy	= ( isset( $options['orderBy'] ) ) 		? $options['orderBy'] : null;
    	$campos		= ( isset( $options['campos'] ) ) 		? $options['campos'] : '*';
    	$where		= ( isset( $options['where'] ) ) 		? $options['where'] : null;
    	$precondicao= ( isset( $options['precondicao'] ) ) 	? $options['precondicao'] : null;
    	$offset     = ( isset( $options['offset'] ) ) 	    ? $options['offset'] : null;
    	$limit      = ( isset( $options['limit'] ) ) 	    ? $options['limit'] : null;
    	
    	$sql = "SELECT $campos FROM $tables ";
        
    	if ( $where )
    		$sql .= "WHERE $where ";    		
    	else {
			# Testando se existe precondicao 
    		if($precondicao){
    			$sql .= "WHERE $precondicao ";
    			if (trim($valor) <> "" && $campo <> "0"){
    				$sql .= " AND ";
    			}    
    		}
    		else{
    			if (trim($valor) <> "" && $campo <> "0"){
    				$sql .= " WHERE ";
    			}
    		}
    		
	    	if (trim($valor) <> "" && $campo <> "0"){	        		    		
	    		if ( strpos ( $campo, " " ) > -1 )
	    			$sql .= '"' . $campo. '" ';
	    		else
	    			$sql .= $campo . " ";
	    		
	    		$tipo = TSqlSelect::getFieldType( $tables, $campo );
	            	
	    		# Se for a chave, campo = valor
	    		if ( $tablekey AND $campo == $tablekey )
	    			$sql .= "$operador $valor";
	    			
	    		# Caso de um campo numérico e um valor não numérico, retornar nada
	    		elseif ( ($tipo == 'numeric' && !is_numeric( $valor )) OR ($tipo == 'date' && !TUtils::is_date( $valor )))
	    			$sql .= "IS NULL AND $campo IS NOT NULL";
	    		
	    		else {
	            	
	            	if ( $operador == "ilike" ){
	                	if ( $tipo == 'string' )
	                		$sql .= "$operador '%$valor%' ";	                		
	                	else {
	                		if($tipo == 'date')
	                			$sql .= "= '$valor' ";
	                		else
	            				$sql .= "= $valor";
	                	}
	            	}
	           		else {
	           			
	           			# Transforma o operador '=' em 'ilike' para Strings e campos não identificados
	           			if ( ( $tipo === 'string' OR $tipo === NULL ) AND $operador === '=' )
	           				$operador = 'ilike';
	           					
	           			$sql .= "$operador ";
	           			
	           			if ( $tipo === 'string' OR $tipo === NULL OR $tipo='date')
	           				$sql .= "'$valor'";
	           			else
	           				$sql .= $valor;
	           				
	           		}           
	    	
	            }
	    	}
	    	
		}
		if ( $orderBy )
			$sql .= " ORDER BY $orderBy $order";
			
		if ( $limit )
			$sql .= " LIMIT $limit";
			
		if ( $offset )
			$sql .= " OFFSET $offset";
    	
		return TUtils::CriarResultSet($sql);
		
	}
	
	public static function customSelect ( $sql ){
		
		return TUtils::CriarResultSet( $sql );
		
	}
	
	public static function getFieldType ( $tables, $field ){
		
		$sql = "SELECT ";
		if ( strpos( $field, ' ' ) >-1 )
			$sql .= '"' . $field . '" ';
		else
			$sql .= $field . " ";
		$sql .= "FROM $tables LIMIT 1";
		
    	$result = TUtils::CriarResultSet($sql);
    	$tipo = pg_field_type( $result, 0 );
		
    	if ( $tipo )
    		if ( strpos( $tipo, 'int' ) > -1 )
    			return 'numeric';
	    	if ( strpos( $tipo, 'varchar' ) > -1 OR strpos( $tipo, 'text' ) > -1 )
    			return 'string';
    		if ( strpos($tipo, 'date') > -1 OR strpos($tipo, 'timestamp') > -1 )
    			return 'date';
    		
	}
	
	public static function arrayToString( $array, $chave ){
		
		if ( !is_array( $array ) )
			return false;
		
		$string = '';
		
		foreach( $array as $a )
			$string .= $a[$chave] . ',';
		
		
		return substr( $string, 0, strlen( $string ) -1 );
	
	}
	
	
	public static function prepareFilterSQL(array $filterData, $table){
	    $sql = '';
	    $flag = false;	
	    foreach($filterData as $data){
	        if (!empty($data['valor'])){	         	         
	         $sql .= ($flag)? ' AND ': '';     
	    	 $sql .= TSqlSelect::prepareOneFilterSQL($data['campo'],$data['valor'],$table);
	    	 $flag = true;
	        }	    	  
	    }	    
	    return $sql;     
	}
	
	public static function prepareOneFilterSQL($campo, $valor, $table){
	    $sql = ' ';
        if (trim($valor) <> "" && $campo <> "0"){	        		    		
	    		if ( strpos ( $campo, " " ) > -1 )
	    			$sql .= '"' . $campo. '" ';
	    		else
	    			$sql .= $campo . " ";
	    		
	    		$tipo = TSqlSelect::getFieldType( $table, $campo );   	
	    		    			
	    		# Caso de um campo numérico e um valor não numérico, retornar nada
	    		if ( ($tipo == 'numeric' && !is_numeric( $valor )) OR ($tipo == 'date' && !TUtils::is_date( $valor )))
	    			$sql .= "IS NULL AND $campo IS NOT NULL ";	    		
	    		else {            	
	            	
                	if ( $tipo == 'string' )
                		$sql .= " ilike '%$valor%' ";	                		
                	else {
                		if($tipo == 'date')
                			$sql .= " = '$valor' ";
                		else
            				$sql .= " = $valor ";
                	}   	
	            }
        }
        
        return $sql;
	}
	
}

?>